package shuaige.jdk.stream.collectors相关的方法.toxx转换相关;

import cn.hutool.core.collection.CollUtil;
import shuaige.jdk.model.Employee;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collectors;

public class ToMap {

    public static void main(String[] args) {
        第1个重载方法_直接转换();
    }

    public static void 第1个重载方法_直接转换() {
        List<Employee> employeeList = CollUtil.newArrayList(
                new Employee("销售1", "北京", 1),
                new Employee("销售2", "上海", 2)
        );
        // 转换指定属性
        employeeList.stream()
                .collect(Collectors.toMap(Employee::getCity, Employee::getSales));
        // 如果希望得到 Map 的 value 为对象本身1
        employeeList.stream()
                .collect(Collectors.toMap(Employee::getCity, Function.identity()));
        // 如果希望得到 Map 的 value 为对象本身1
        employeeList.stream()
                .collect(Collectors.toMap(Employee::getCity, t -> t));

    }

    public static void 第2个重载方法_处理重复键值_合并重复键值的结果() {
        List<Employee> employeeList = CollUtil.newArrayList(
                new Employee("销售1", "北京", 1),
                new Employee("销售2", "上海", 2),
                new Employee("销售3", "北京", 3)
        );
        // 转换指定属性
        Map<String, Integer> collect1 = employeeList.stream()
                .collect(Collectors.toMap(Employee::getCity, Employee::getSales, (n1, n2) -> {
                    // 合并结果
                    return n1 + n2;
                }));
        System.out.println(collect1);
    }

    public static void 第3个重载方法_处理重复键值_合并结果_自定义返回Map类型() {
        List<Employee> employeeList = CollUtil.newArrayList(
                new Employee("销售1", "北京", 1),
                new Employee("销售2", "上海", 2),
                new Employee("销售3", "北京", 3)
        );
        // 转换指定属性
        Map<String, Integer> collect1 = employeeList.stream()
                .collect(Collectors.toMap(Employee::getCity, Employee::getSales, (n1, n2) -> {
                            // 合并结果
                            return n1 + n2;
                        }
                        // 返回的 Map 是根据 Key 排序
                        , TreeMap::new));
        System.out.println(collect1);

        // 转换指定属性
        Map<String, Integer> collect2 = employeeList.stream()
                .collect(Collectors.toMap(Employee::getCity, Employee::getSales, (n1, n2) -> {
                            // 合并结果
                            return n1 + n2;
                        }
                        // 返回的 Map 是根据 Key 排序
                        , () -> {
                            return new LinkedHashMap<>();
                        }));
        System.out.println(collect2);
    }

}
